﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Configuration;
using System.IO;

namespace Manager
{
    public class Config
    {

        public const int CANT_MAX_SERV = 5;
        private string ip_manager = "";
        private int puerto_manager;
        private string ip_administrador = "";
        private int puerto_administrador;
        private List<ServerNode> servidores = new List<ServerNode>(5);
        private List<ClientNode> clientes = new List<ClientNode>(3);
        private Object mutex = new Object();

        private string path = "";

        public Config(string path)
        {
            this.path = path;
            CargarConfiguracion();
        }

        public List<ClientNode> Clientes
        {
            get { return clientes; }
            set { clientes = value; }
        }

        public string Ip_manager
        {
            get { return ip_manager; }
            set { ip_manager = value; }
        }

        public int Puerto_manager
        {
            get { return puerto_manager; }
            set { puerto_manager = value; }
        }

        public string Ip_administrador
        {
            get { return ip_administrador; }
            set { ip_administrador = value; }
        }

        public int Puerto_administrador
        {
            get { return puerto_administrador; }
            set { puerto_administrador = value; }
        }

        private void CargarConfiguracion() {

            Console.WriteLine("Obteniendo configuracion...");

            int paramPuerto = 0;
            string paramIp = "";
            string paramNom = "";
            int count = 0;            

            string path = ConfigurationManager.AppSettings["Path"];

            if (File.Exists(path))
            {
            XmlDocument xDoc = new XmlDocument();
             xDoc.Load(path);

            #region // Carga de información de Servidores
            XmlNodeList serverNodes = xDoc.GetElementsByTagName("SERVIDOR");
            foreach (XmlNode node in serverNodes)
            {
                count++;
                if (count < 6)
                {
                    paramIp = node.SelectSingleNode("IP").InnerText;
                    paramPuerto = int.Parse(node.SelectSingleNode("PUERTO").InnerText);
                    paramNom = node.SelectSingleNode("NOMBRE").InnerText;
                    servidores.Add(new ServerNode(paramIp, paramPuerto, paramNom));
                }
                else
                {
                    Console.WriteLine("Warning: han quedado servidores sin cargar");
                }
            }
            #endregion

            #region // Carga de información de Clientes
            count = 0;
            XmlNodeList clientesNodes = xDoc.GetElementsByTagName("CLIENTE");
            foreach (XmlNode clientNode in clientesNodes)
            {
                count++;
                if (count < 4)
                {
                    paramPuerto = int.Parse(clientNode.SelectSingleNode("PUERTO").InnerText);
                    paramIp = clientNode.SelectSingleNode("IP").InnerText;
                    clientes.Add(new ClientNode(paramIp, paramPuerto));
                }
                else
                {
                    Console.WriteLine("Warning: han quedado clientes sin cargar");
                }
            }
            #endregion

            #region //Carga de información de Administración
            if (xDoc.SelectNodes("//CONFIGURACION//ADMINISTRACION").Count == 1)
            {
                XmlNode admNode = xDoc.SelectSingleNode("//CONFIGURACION//ADMINISTRACION");
                Puerto_administrador = int.Parse(admNode.SelectSingleNode("PUERTO").InnerText);
                Ip_administrador = admNode.SelectSingleNode("IP").InnerText;
            }
            else
            {
                Console.WriteLine("Error: configuracion del administrador");
            }
            #endregion
            }
            else
            {
                Console.WriteLine("Ruta de configuracion no encontrada..");
                Console.Read();
                Environment.Exit(0);
            }
        }

        public int ObtenerCantServidores()
        {
            int count = 0;
            lock (mutex)
            {
                foreach (ServerNode serv in servidores)
                {
                    if (serv.Vivo)
                        count++;
                }
                return count;
            }
        }

        public void EliminarServidor(ServerNode s)
        {
            lock (mutex)
            {
                servidores.Remove(s);
            }
        }

        public void AgreagarServidor(ServerNode s)
        {
            lock (mutex)
            {
                servidores.Add(s);
            }
        }

        public List<ServerNode> ObtenerServidores()
        {
            lock (mutex)
            {
                return servidores;
            }
        }

        public ServerNode ObtenerServidor(int idServ)
        {
            foreach (ServerNode s in Manager.conf.ObtenerServidores())
            {
                if (s.Identificador == idServ)
                    return s;
            }
            return null;
        }

        
    }
}
